﻿using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using STeaL.Algorithm;
using STeaL.Collections.Generic;
using STeaL.Functional;

namespace Test {

  [TestClass]
  public class multiset_adaptorTest {

    private TestContext testContextInstance;

    /// <summary>
    ///現在のテストの実行についての情報および機能を
    ///提供するテスト コンテキストを取得または設定します。
    ///</summary>
    public TestContext TestContext {
      get { return testContextInstance; }
      set { testContextInstance = value; }
    }

    #region 追加のテスト属性
    // クラス内で最初のテストを実行する前に、ClassInitialize を使用してコードを実行してください
    [ClassInitialize()]
    public static void ClassInitialize(TestContext testContext) { }

    // クラス内のテストをすべて実行したら、ClassCleanup を使用してコードを実行してください
    [ClassCleanup()]
    public static void ClassCleanup() { }

    // 各テストを実行する前に、TestInitialize を使用してコードを実行してください
    [TestInitialize()]
    public void TestInitialize() {
      c = new List<int>();
      a = new multiset_adaptor<int>(c, rel_op.less<int>);
    }

    // 各テストを実行した後に、TestCleanup を使用してコードを実行してください
    [TestCleanup()]
    public void TestCleanup() { }
    #endregion

    [TestMethod]
    public void Add() {
      for ( int i = 0; i < 10; ++i ) a.Add(9-i);
      Assert.IsTrue(a.is_sorted());
      for ( int i = 10; i < 20; i += 2 ) a.Add(i);
      a.Add(11);
      a.Add(11);
      a.Add(15);
      a.Add(15);
      Assert.IsTrue(a.is_sorted());
    }

    [TestMethod]
    public void Insert_1() {
      for ( int i = 0; i < 10; ++i ) a.Add(i);
      a.Insert(10,12);
      a.Insert(10,12);
      a.Insert(0,0);
      Assert.IsTrue(a.is_sorted());
    }

    [TestMethod]
    [ExpectedException(typeof(ArgumentException))]
    public void Insert_2() {
      for ( int i = 0; i < 10; ++i ) a.Add(i);
      a.Insert(10,12);
      a.Insert(10,15);
    }

    [TestMethod]
    [ExpectedException(typeof(ArgumentException))]
    public void Insert_3() {
      for ( int i = 0; i < 10; ++i ) a.Add(i);
      a.Insert(0,2);
    }

    [TestMethod]
    public void Replace_1() {
      for ( int i = 0; i < 10; ++i ) a.Add(i);
      a[2] = 2;
      Assert.IsTrue(a.is_sorted());
      a[9] = 10;
      Assert.IsTrue(a.is_sorted());
    }

    [TestMethod]
    [ExpectedException(typeof(ArgumentException))]
    public void Replace_2() {
      for ( int i = 0; i < 10; ++i ) a.Add(i);
      a[2] = 4;
    }

    [TestMethod]
    [ExpectedException(typeof(ArgumentException))]
    public void Replace_3() {
      for ( int i = 0; i < 10; ++i ) a.Add(i);
      a[2] = 0;
    }

    private IList<int> c;
    private multiset_adaptor<int> a;
  }
}
